﻿// -------------------------------------------------------------------------------------------------------
// LICENSE INFORMATION
//
// - This software is licensed under the MIT shared source license.
// - The "official" source code for this project is maintained at http://mtcagent.codeplex.com
//
// Copyright (c) 2010 OpenNETCF Consulting
//
// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and 
// associated documentation files (the "Software"), to deal in the Software without restriction, 
// including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, 
// and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, 
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in all copies or substantial 
// portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
// NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 
// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 
// -------------------------------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Configuration;
using System.IO;
using System.Reflection;
using OpenNETCF.IoC;
using System.Diagnostics;
using System.Xml.Linq;
using System.Threading;
using System.Net.Sockets;
using System.Net;

namespace OpenNETCF.MTConnect
{
    internal class SHDRAdapterService
    {
        private SHDRListener Listener { get; set; }
        private IMTConnectProvider Provider { get; set; }

        private List<string> m_ignoreIDs = new List<string>();

        [InjectionConstructor]
        public SHDRAdapterService([ServiceDependency]IMTConnectProvider provider, [ServiceDependency]IConfigurationService configService)
        {
            Provider = provider;

            Listener = new SHDRListener(configService.AgentConfiguration.SHDRPort);

            Listener.DataItemSet += new EventHandler<GenericEventArgs<SHDRValue>>(Listener_DataItemSet);
            Listener.ConditionSet += new EventHandler<GenericEventArgs<SHDRValue>>(Listener_ConditionSet);
            
            Listener.Start();
        }

        void Listener_ConditionSet(object sender, GenericEventArgs<SHDRValue> e)
        {
            if (m_ignoreIDs.Contains(e.Value.ID))
            {
                Debug.WriteLine(string.Format("DataItemID {0} received from SHDR Adapter, but no item with that ID exists.", e.Value.ID));
                return;
            }

            try
            {
                Provider.SetDataByDataItemID("SHDR Adapter", e.Value.ID, e.Value.Value);
            }
            catch (InvalidIDException)
            {
                m_ignoreIDs.Add(e.Value.ID);
            }
        }

        void Listener_DataItemSet(object sender, GenericEventArgs<SHDRValue> e)
        {
            if (m_ignoreIDs.Contains(e.Value.ID))
            {
                Debug.WriteLine(string.Format("DataItemID {0} received from SHDR Adapter, but no item with that ID exists.", e.Value.ID));
                return;
            }

            try
            {
                Provider.SetDataByDataItemID("SHDR Adapter", e.Value.ID, e.Value.Value);
            }
            catch (InvalidIDException)
            {
                m_ignoreIDs.Add(e.Value.ID);
            }
        }
    }
}
